מחלקה בתוך מחלקה
איך אני יכול להשתמש ב DB בתוך ה USER?
6 תשובות
http://phpguide.co.il/phplive?code=1020
class DB
{
/**
* Query ..
*
* @param string $query
* @return string
*/
public function query($query)
{
return $query;
}
}
class User
{
/**
* @var DB
*/
protected $db;
/**
* New User ...
*
* @param DB $db
* @return void
*/
public function __construct($db)
{
$this->db = $db;
}
/**
* Get DB ...
*
* @return DB
*/
protected function getDB()
{
return $this->db;
}
/**
* Use DB Class ...
*
* @return string
*/
public function useDBClass()
{
return $this->getDB()->query('SELECT 1;');
}
}
$db = new DB;
$user = new User($db);
print $user->useDBClass(); // prints 'SELECT 1;' ..
מה הבעיה? אתה פשוט מעביר מופע של מחלקה DB למחלקה User..
לא משנה עם המחלקה יורשת או לא..
המחלקה User לא מממשת פונקציות של DB אלה משתמשת בהן,במידה ואתה רוצה ליצור פונקציות אחידות כמו get,first,exist וכל מיני שטויות כאלה תדאג שהמחלקות של שמתקשורת ל DB יממשו interface.
משתמשים ב-Extend רק אם יש קשר של הורה-ילד בין המחלקות. לדוגמה, מחלקת "מכונית מירוץ" תירש את מחלקת מכונית, ומחלקת "ילד" תירש את מחלקת "בן אדם", אבל מחלקת " משתמש" לא תירש את מחלקת "מסד", כי אין פה קשר מתאים.
זה מצויין שהעברת את המחלקה בפרמטר, אבל למה הוספת מתודת getDB? הרי הרעיון הוא שהמחלקה User תשתמש במחלקת המסד בתוך המתודות שלה, ואתה רק תקרא למתודות, בלי להשתמש במסד מחוץ למחלקה.
עדיף כמובן לפצל את זה עם מחלקת ריפוזיטורי, אבל תתחיל בזה.
בכל מקרה, ממליץ לך לקרוא את הספר של אלכס על תכנות מונחה עצמים, מאוד מומלץ! אתה תבין בהרבה יותר על מה מדובר, ומהי הדרך הנכונה לממש את זה.